﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using EncuentraloSilverlight.Web.Models;
using System.Data.Linq;

namespace EncuentraloSilverlight.Models
{
    public class ProductRepository
    {
        private EncuentraloDataBaseModelDataContext db;


        public ProductRepository()
        {
            db = new EncuentraloDataBaseModelDataContext();
            DataLoadOptions options = new DataLoadOptions();
            options.LoadWith<Product>(k => k.ProductCategories);
            options.LoadWith<Product>(k => k.Seller);
            db.LoadOptions = options;
        }

        //Metodos de busqueda

        /// <summary>
        /// Retorna todos los productos
        /// </summary>
        /// <returns></returns>
        public IQueryable<Product> FindAllProducts()
        {
            var products = db.Products.AsQueryable();
            return products;
        }

        /// <summary>
        /// Buscar un producto en la base de datos que 
        /// </summary>
        /// <param name="name">Nombre del producto que se desea buscar en la base de datos</param>
        /// <returns>Retorna los productos que coincidan</returns>
        public IQueryable<Product> FindProductByName(string name)
        {
            var v1 = from product in db.Products
                     where (product.Name.Contains(name) || product.Name.Equals(name))
                     select product;
            return v1;
        }

        /// <summary>
        /// Retorna un producto asociado a un id
        /// </summary>
        /// <param name="id">Id del producto</param>
        /// <returns>Retorna un producto</returns>
        public Product GetProduct(int id)
        {
            var v1 = db.Products.SingleOrDefault(p => p.ProductID == id);
            return v1;
        }

        //Metodos para agregar y eliminar

        /// <summary>
        /// Agrega un producto
        /// </summary>
        /// <param name="product">Producto que se desea agregar</param>
        public void Add(Product product)
        {
            db.Products.InsertOnSubmit(product);
            Save();
        }

        /// <summary>
        /// Elimina un Producto
        /// </summary>
        /// <param name="product">Producto que se desea eliminar</param>
        public void Delete(Product product)
        {
            db.Products.Attach(product);
            db.ProductCategories.DeleteAllOnSubmit(product.ProductCategories);
            db.Products.DeleteOnSubmit(product);
            Save();
        }

        public void ModifyProduct(int product_id, Product product)
        {
            Product prod = db.Products.FirstOrDefault(k => k.ProductID == product_id);
            prod.Name = product.Name;
            prod.Description = product.Description;
            prod.Price = product.Price;
            Save();
        }

        // Consistencia

        private void Save()
        {
            db.SubmitChanges();
        }
        

    }
}